Philly Crime Data

Reading in Data

We first read in two data sets called “philly” representing several different values having to due with crimes that have occurred in the Philadelphia area since 2015. “Philly” has 15520 observations and 18 total variables.

philly  <- na.omit(st_read("https://pengdsci.github.io/STA553VIZ/w08/PhillyShootings.geojson"))
Reading layer `PhillyShootings' from data source 
  `https://pengdsci.github.io/STA553VIZ/w08/PhillyShootings.geojson' 
  using driver `GeoJSON'
replacing null geometries with empty geometries
Simple feature collection with 15555 features and 21 fields (with 29 geometries empty)
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -75.27362 ymin: 39.87799 xmax: -74.95936 ymax: 40.13117
Geodetic CRS:  WGS 84
head(philly)
Simple feature collection with 6 features and 21 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -75.10962 ymin: 40.01166 xmax: -75.08552 ymax: 40.01489
Geodetic CRS:  WGS 84
  objectid year         dc_key code               date_     time race sex age
1 12728033 2016 201615054780.0  400 2016-06-06 20:00:00 12:15:00    B   M  19
2 12728034 2016 201615117555.0  300 2016-12-03 19:00:00 05:43:00    B   M  38
3 12728035 2018 201815093657.0  400 2018-10-13 20:00:00 21:02:00    B   M  31
4 12728036 2020 202015094989.0  400 2020-12-01 19:00:00 17:12:00    B   M  23
5 12728037 2018 201824100255.0  400 2018-11-08 19:00:00 04:29:00    B   M  27
6 12728038 2019 201924106228.0  400 2019-10-27 20:00:00 04:10:00    W   M  22
     wound officer_involved offender_injured offender_deceased
1     Hand                N                N                 N
2    Chest                N                N                 N
3 Multiple                N                N                 N
4     Hand                N                N                 N
5      Arm                N                N                 N
6 Multiple                N                N                 N
                      location latino   point_x  point_y dist inside outside
1     4600 BLOCK Frankford Ave      0 -75.08552 40.01489   15      0       1
2     4600 BLOCK Frankford Ave      0 -75.08552 40.01489   15      0       1
3     4600 BLOCK Frankford Ave      0 -75.08552 40.01489   15      0       1
4     4600 BLOCK FRANKFORD AVE      0 -75.08552 40.01489   15      0       1
5 900 BLOCK E Hunting Park Ave      0 -75.10962 40.01167   24      0       1
6 900 BLOCK E HUNTING PARK AVE      1 -75.10962 40.01167   24      0       1
  fatal                   geometry
1     0 POINT (-75.08552 40.01489)
2     0 POINT (-75.08552 40.01489)
3     1 POINT (-75.08552 40.01489)
4     0 POINT (-75.08552 40.01489)
5     0 POINT (-75.10962 40.01167)
6     0 POINT (-75.10962 40.01167)

Mapping

Now, we can create a leaflet map looking at fatal versus non-fatal crimes that occured in Philadelphia in the year 2023 by using the “color” function once again. The color is dependent on whether or not a crime was labeled as “Fatal” or “Nonfatal”. So, each category will have a specific color, representing the type of crime (fatal vs. nonfatal) that occurred at the time. The map is similar to the previous maps above in which each circle point represents a specific crime. Hovering over a point will give the “Neighborhood”, “Date”, “Race”, and “Sex”, “Age”, and “Street” for that specific crime.

phillyNeighbor  <- st_read("https://pengdsci.github.io/STA553VIZ/w08/Neighborhoods_Philadelphia.geojson")
Reading layer `Neighborhoods_Philadelphia' from data source 
  `https://pengdsci.github.io/STA553VIZ/w08/Neighborhoods_Philadelphia.geojson' 
  using driver `GeoJSON'
Simple feature collection with 158 features and 8 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -75.28027 ymin: 39.867 xmax: -74.95576 ymax: 40.13799
Geodetic CRS:  WGS 84
library(leaflet)
library(sf)
library(htmltools)
library(dplyr)
## Create sf object
philly_sf <- st_as_sf(philly, coords = c("point_x", "point_y"), crs = 4326)

# Define color palette for fatal and non-fatal crimes
pal <- leaflet::colorFactor(
  palette = c("red", "gold"), 
  domain = c("Fatal", "Non-Fatal")
)

fatal_color <- "red"
non_fatal_color <- "gold"

map <- leaflet(philly) %>%
  addTiles() %>%
  addCircleMarkers(
    ~point_x, ~point_y,
    color = ifelse(philly$fatal == 1, fatal_color, non_fatal_color),
    radius = 5,
    label = ~paste("Object ID: ", philly$objectid,
        "Year: ", philly$year,
        "Race: ", philly$race,
        "Sex: ", philly$sex,
        "Age: ", philly$age,
        "Wound: ", philly$wound,
        "Location: ", philly$location),
    labelOptions = labelOptions(
      direction = "auto"
    )
  ) %>%
  addLegend(
    position = "bottomright",
    colors = c(fatal_color, non_fatal_color),
    labels = c("Fatal", "Non-Fatal"),
    title = "Crime Type"
  ) %>%
  addScaleBar() %>%
  addControl(
    html = "<h4>Philadelphia Crime Locations (2015-2024)</h4>",
    position = "topright"
  )%>%
  setView(lng = -75.1527, lat = 39.9707, zoom = 11) %>%
  addProviderTiles(providers$Esri.WorldGrayCanvas) %>%
    addPolygons(data = phillyNeighbor,
              color = 'skyblue',
              weight = 1)  %>%
  addCircleMarkers(data = philly_sf,
                   radius = 5,
                   color = ~pal(fatal),
                   stroke = FALSE, 
                   fillOpacity = 0.5,
                   clusterOptions = markerClusterOptions(maxClusterRadius = 40)) %>%
  # Adding images to the map
  addMarkers(lng = -75.1652, lat = 39.9526, popup = '<img src="https://pengdsci.github.io/STA553VIZ/w08/PhillyCityHall.jpg" width="200" height="200">') %>%
  # HTML style for the map title
  addControl(HTML('<div class="leaflet-control.map-title">Philadelphia Crime Locations (2015-2024)</div>'), position = "topright") %>%
  addLayersControl(baseGroups = c('Dark', 'DarkLabel', 'Esri'),
                   overlayGroups = c("Crime Data"),
                   options = layersControlOptions(collapsed = TRUE))
  

# Display the map
map
LS0tDQp0aXRsZTogIk1vcmUgTWFwcGluZyINCmF1dGhvcjogIkVkd2FyZCBDb2xlbWFuIg0KZGF0ZTogIldlc3QgQ2hlc3RlciBVbml2ZXJzaXR5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCmVkaXRvcl9vcHRpb25zOg0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KaDEudGl0bGUgew0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBmb250LXZhcmlhbnQtY2Fwczogbm9ybWFsOw0KfQ0KaDQuYXV0aG9yIHsgDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyANCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IA0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IA0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IA0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7DQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCg0KLyogVGFiIGZlYXR1cmVzICovDQoubmF2PmxpPmEgew0KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgICBkaXNwbGF5OiBibG9jazsNCiAgICBwYWRkaW5nOiAycHggMTVweDsNCiAgICBjb2xvcjogIzk5MDAwMDsNCn0NCi5uYXYtcGlsbHM+bGkuYWN0aXZlPmEsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6aG92ZXIsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6Zm9jdXMgew0KICAgIGNvbG9yOiAjZmZmZmZmOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICM5OTAwMDA7DQp9DQovKg0KbmF2LXBpbGxzPmxpOm50aC1jaGlsZCgyKSB7DQogICAgYmFja2dyb3VuZDogZ3JlZW47DQogfQ0KICovDQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgY29tbWVudD1OQX0NCm9wdGlvbnMocmVwb3MgPSBsaXN0KENSQU49Imh0dHA6Ly9jcmFuLnJzdHVkaW8uY29tLyIpKQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJjb3dwbG90IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImNvd3Bsb3QiKQ0KICAgbGlicmFyeShjb3dwbG90KQ0KfQ0KaWYgKCFyZXF1aXJlKCJsYXRleDJleHAiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibGF0ZXgyZXhwIikNCiAgIGxpYnJhcnkobGF0ZXgyZXhwKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgIGxpYnJhcnkocGxvdGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJnYXBtaW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZ2FwbWluZGVyIikNCiAgIGxpYnJhcnkoZ2FwbWluZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwbmciKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInBuZyIpICAgIA0KICAgIGxpYnJhcnkoInBuZyIpDQp9DQppZiAoIXJlcXVpcmUoIlJDdXJsIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJSQ3VybCIpICAgIA0KICAgIGxpYnJhcnkoIlJDdXJsIikNCn0NCmlmICghcmVxdWlyZSgiY29sb3VycGlja2VyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjb2xvdXJwaWNrZXIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiY29sb3VycGlja2VyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dhbmltYXRlIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ2FuaW1hdGUiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dhbmltYXRlIikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnaWZza2kiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2lmc2tpIikNCn0NCmlmICghcmVxdWlyZSgibWFnaWNrIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJtYWdpY2siKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgibWFnaWNrIikNCn0NCmlmICghcmVxdWlyZSgiZ3JEZXZpY2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnckRldmljZXMiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ3JEZXZpY2VzIikNCn0NCmlmICghcmVxdWlyZSgianBlZyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygianBlZyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJqcGVnIikNCn0NCmlmICghcmVxdWlyZSgiZ2dyaWRnZXMiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncmlkZ2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdncmlkZ2VzIikNCn0NCmlmICghcmVxdWlyZSgicGx5ciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJwbHlyIikNCn0NCmlmICghcmVxdWlyZSgiZ2dpcmFwaCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dpcmFwaCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ2lyYXBoIikNCn0NCmlmICghcmVxdWlyZSgiaGlnaGNoYXJ0ZXIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImhpZ2hjaGFydGVyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImhpZ2hjaGFydGVyIikNCn0NCmlmICghcmVxdWlyZSgiZm9yZWNhc3QiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImZvcmVjYXN0IikNCn0NCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGV0IikNCn0NCmlmICghcmVxdWlyZSgic2YiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInNmIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoInNmIikNCn0NCiMjIA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFJVRSwgICANCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BKQ0KYGBgDQoNCiMgUGhpbGx5IENyaW1lIERhdGENCiMjIFJlYWRpbmcgaW4gRGF0YQ0KICBXZSBmaXJzdCByZWFkIGluIHR3byBkYXRhIHNldHMgY2FsbGVkICJwaGlsbHkiIHJlcHJlc2VudGluZyBzZXZlcmFsIGRpZmZlcmVudCB2YWx1ZXMgaGF2aW5nIHRvIGR1ZSB3aXRoIGNyaW1lcyB0aGF0IGhhdmUgb2NjdXJyZWQgaW4gdGhlIFBoaWxhZGVscGhpYSBhcmVhIHNpbmNlIDIwMTUuICJQaGlsbHkiIGhhcyAxNTUyMCBvYnNlcnZhdGlvbnMgYW5kIDE4IHRvdGFsIHZhcmlhYmxlcy4NCmBgYHtyLCBjb21tZW50PU5BfQ0KcGhpbGx5ICA8LSBuYS5vbWl0KHN0X3JlYWQoImh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL1NUQTU1M1ZJWi93MDgvUGhpbGx5U2hvb3RpbmdzLmdlb2pzb24iKSkNCmhlYWQocGhpbGx5KQ0KYGBgDQoNCiMjIE1hcHBpbmcNCiAgTm93LCB3ZSBjYW4gY3JlYXRlIGEgbGVhZmxldCBtYXAgbG9va2luZyBhdCBmYXRhbCB2ZXJzdXMgbm9uLWZhdGFsIGNyaW1lcyB0aGF0IG9jY3VyZWQgaW4gUGhpbGFkZWxwaGlhIGluIHRoZSB5ZWFyIDIwMjMgYnkgdXNpbmcgdGhlICJjb2xvciIgZnVuY3Rpb24gb25jZSBhZ2Fpbi4gVGhlIGNvbG9yIGlzIGRlcGVuZGVudCBvbiB3aGV0aGVyIG9yIG5vdCBhIGNyaW1lIHdhcyBsYWJlbGVkIGFzICJGYXRhbCIgb3IgIk5vbmZhdGFsIi4gU28sIGVhY2ggY2F0ZWdvcnkgd2lsbCBoYXZlIGEgc3BlY2lmaWMgY29sb3IsIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBjcmltZSAoZmF0YWwgdnMuIG5vbmZhdGFsKSB0aGF0IG9jY3VycmVkIGF0IHRoZSB0aW1lLiBUaGUgbWFwIGlzIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIG1hcHMgYWJvdmUgaW4gd2hpY2ggZWFjaCBjaXJjbGUgcG9pbnQgcmVwcmVzZW50cyBhIHNwZWNpZmljIGNyaW1lLiBIb3ZlcmluZyBvdmVyIGEgcG9pbnQgd2lsbCBnaXZlIHRoZSAiTmVpZ2hib3Job29kIiwgIkRhdGUiLCAiUmFjZSIsIGFuZCAiU2V4IiwgIkFnZSIsIGFuZCAiU3RyZWV0IiBmb3IgdGhhdCBzcGVjaWZpYyBjcmltZS4NCmBgYHtyLCBjb21tZW50PU5BfQ0KcGhpbGx5TmVpZ2hib3IgIDwtIHN0X3JlYWQoImh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL1NUQTU1M1ZJWi93MDgvTmVpZ2hib3Job29kc19QaGlsYWRlbHBoaWEuZ2VvanNvbiIpDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShodG1sdG9vbHMpDQpsaWJyYXJ5KGRwbHlyKQ0KIyMgQ3JlYXRlIHNmIG9iamVjdA0KcGhpbGx5X3NmIDwtIHN0X2FzX3NmKHBoaWxseSwgY29vcmRzID0gYygicG9pbnRfeCIsICJwb2ludF95IiksIGNycyA9IDQzMjYpDQoNCiMgRGVmaW5lIGNvbG9yIHBhbGV0dGUgZm9yIGZhdGFsIGFuZCBub24tZmF0YWwgY3JpbWVzDQpwYWwgPC0gbGVhZmxldDo6Y29sb3JGYWN0b3IoDQogIHBhbGV0dGUgPSBjKCJyZWQiLCAiZ29sZCIpLCANCiAgZG9tYWluID0gYygiRmF0YWwiLCAiTm9uLUZhdGFsIikNCikNCg0KZmF0YWxfY29sb3IgPC0gInJlZCINCm5vbl9mYXRhbF9jb2xvciA8LSAiZ29sZCINCg0KbWFwIDwtIGxlYWZsZXQocGhpbGx5KSAlPiUNCiAgYWRkVGlsZXMoKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycygNCiAgICB+cG9pbnRfeCwgfnBvaW50X3ksDQogICAgY29sb3IgPSBpZmVsc2UocGhpbGx5JGZhdGFsID09IDEsIGZhdGFsX2NvbG9yLCBub25fZmF0YWxfY29sb3IpLA0KICAgIHJhZGl1cyA9IDUsDQogICAgbGFiZWwgPSB+cGFzdGUoIk9iamVjdCBJRDogIiwgcGhpbGx5JG9iamVjdGlkLA0KICAgICAgICAiWWVhcjogIiwgcGhpbGx5JHllYXIsDQogICAgICAgICJSYWNlOiAiLCBwaGlsbHkkcmFjZSwNCiAgICAgICAgIlNleDogIiwgcGhpbGx5JHNleCwNCiAgICAgICAgIkFnZTogIiwgcGhpbGx5JGFnZSwNCiAgICAgICAgIldvdW5kOiAiLCBwaGlsbHkkd291bmQsDQogICAgICAgICJMb2NhdGlvbjogIiwgcGhpbGx5JGxvY2F0aW9uKSwNCiAgICBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMoDQogICAgICBkaXJlY3Rpb24gPSAiYXV0byINCiAgICApDQogICkgJT4lDQogIGFkZExlZ2VuZCgNCiAgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsDQogICAgY29sb3JzID0gYyhmYXRhbF9jb2xvciwgbm9uX2ZhdGFsX2NvbG9yKSwNCiAgICBsYWJlbHMgPSBjKCJGYXRhbCIsICJOb24tRmF0YWwiKSwNCiAgICB0aXRsZSA9ICJDcmltZSBUeXBlIg0KICApICU+JQ0KICBhZGRTY2FsZUJhcigpICU+JQ0KICBhZGRDb250cm9sKA0KICAgIGh0bWwgPSAiPGg0PlBoaWxhZGVscGhpYSBDcmltZSBMb2NhdGlvbnMgKDIwMTUtMjAyNCk8L2g0PiIsDQogICAgcG9zaXRpb24gPSAidG9wcmlnaHQiDQogICklPiUNCiAgc2V0VmlldyhsbmcgPSAtNzUuMTUyNywgbGF0ID0gMzkuOTcwNywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZEdyYXlDYW52YXMpICU+JQ0KICAgIGFkZFBvbHlnb25zKGRhdGEgPSBwaGlsbHlOZWlnaGJvciwNCiAgICAgICAgICAgICAgY29sb3IgPSAnc2t5Ymx1ZScsDQogICAgICAgICAgICAgIHdlaWdodCA9IDEpICAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhID0gcGhpbGx5X3NmLA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDUsDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSB+cGFsKGZhdGFsKSwNCiAgICAgICAgICAgICAgICAgICBzdHJva2UgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucyhtYXhDbHVzdGVyUmFkaXVzID0gNDApKSAlPiUNCiAgIyBBZGRpbmcgaW1hZ2VzIHRvIHRoZSBtYXANCiAgYWRkTWFya2VycyhsbmcgPSAtNzUuMTY1MiwgbGF0ID0gMzkuOTUyNiwgcG9wdXAgPSAnPGltZyBzcmM9Imh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL1NUQTU1M1ZJWi93MDgvUGhpbGx5Q2l0eUhhbGwuanBnIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+JykgJT4lDQogICMgSFRNTCBzdHlsZSBmb3IgdGhlIG1hcCB0aXRsZQ0KICBhZGRDb250cm9sKEhUTUwoJzxkaXYgY2xhc3M9ImxlYWZsZXQtY29udHJvbC5tYXAtdGl0bGUiPlBoaWxhZGVscGhpYSBDcmltZSBMb2NhdGlvbnMgKDIwMTUtMjAyNCk8L2Rpdj4nKSwgcG9zaXRpb24gPSAidG9wcmlnaHQiKSAlPiUNCiAgYWRkTGF5ZXJzQ29udHJvbChiYXNlR3JvdXBzID0gYygnRGFyaycsICdEYXJrTGFiZWwnLCAnRXNyaScpLA0KICAgICAgICAgICAgICAgICAgIG92ZXJsYXlHcm91cHMgPSBjKCJDcmltZSBEYXRhIiksDQogICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IFRSVUUpKQ0KICANCg0KIyBEaXNwbGF5IHRoZSBtYXANCm1hcA0KYGBgDQoNCg0K